import csv
import os
import tkinter as tk
import subprocess
from tkinter import filedialog, messagebox

# 定义一个函数，用于将CSV文件分割为多个文件
def split_csv(input_file, output_folder, max_cases_per_file=100):
    # 确保输出文件夹存在
    os.makedirs(output_folder, exist_ok=True)

    # 获取输入文件的基础名称
    base_name = os.path.splitext(os.path.basename(input_file))[0]

    # 打开输入文件，指定编码为gbk
    with open(input_file, 'r', encoding='gbk') as file:
        reader = csv.reader(file)
        header = next(reader)  # 读取表头行

        # 初始化变量
        file_count = 0  # 文件计数器
        current_case_count = 0  # 当前文件的测试用例计数
        current_file = None  # 当前输出文件句柄
        writer = None  # CSV写入器

        # 遍历输入文件中的每一行
        for i, row in enumerate(reader):
            # 如果当前文件中的测试用例数达到最大限制，则创建新文件
            if current_case_count % max_cases_per_file == 0:
                # 如果有打开的文件，先关闭它
                if current_file:
                    current_file.close()

                # 创建新文件
                file_count += 1
                current_case_count = 0
                output_file = os.path.join(output_folder, f'{base_name}_part{file_count}.csv')
                current_file = open(output_file, 'w', encoding='gbk', newline='')
                writer = csv.writer(current_file)

                # 将表头写入新文件
                writer.writerow(header)

            # 将当前行写入当前文件
            writer.writerow(row)
            current_case_count += 1

        # 关闭最后一个文件
        if current_file:
            current_file.close()

    # 输出分割完成的信息
    messagebox.showinfo("完成", f"CSV文件已分割成{file_count}个文件，每个文件最多包含{max_cases_per_file}个测试用例。")

    # 自动打开输出目录
    subprocess.run(["explorer", os.path.realpath(output_folder)], shell=True)

# 定义GUI界面
def create_gui():
    def select_input_file():
        file_path = filedialog.askopenfilename(filetypes=[("CSV files", "*.csv")])
        input_file_var.set(file_path)

        # 默认输出目录为输入文件所在目录
        if file_path:
            default_output_folder = os.path.dirname(file_path)
            output_folder_var.set(default_output_folder)

    def select_output_folder():
        folder_path = filedialog.askdirectory()
        output_folder_var.set(folder_path)

    def start_split():
        input_file = input_file_var.get()
        output_folder = output_folder_var.get()
        try:
            max_cases_per_file = int(max_cases_var.get())
        except ValueError:
            messagebox.showerror("错误", "每个文件的最大测试用例数必须是一个整数。")
            return

        if not input_file or not output_folder:
            messagebox.showerror("错误", "请确保选择了输入文件和输出目录。")
            return

        try:
            split_csv(input_file, output_folder, max_cases_per_file)
        except Exception as e:
            messagebox.showerror("错误", f"分割文件时出错：{e}")

    # 创建主窗口
    root = tk.Tk()
    root.title("CSV测试用例分割器")
    root.geometry("800x250")  # 设置默认窗口大小
    root.minsize(800, 250)  # 设置最小窗口大小
    root.resizable(True, True)

    # 设置统一字体
    default_font = ("Arial", 12)
    root.option_add("*Font", default_font)

    # 创建主框架并保持居中布局
    frame = tk.Frame(root)
    frame.pack(expand=True)

    # 输入文件选择
    tk.Label(frame, text="选择CSV文件：").grid(row=0, column=0, padx=10, pady=10, sticky="e")
    input_file_var = tk.StringVar()
    tk.Entry(frame, textvariable=input_file_var, width=50).grid(row=0, column=1, padx=5, pady=10)
    tk.Button(frame, text="浏览...", command=select_input_file, bg="#4CAF50", fg="white").grid(row=0, column=2, padx=10, pady=10)

    # 输出目录选择
    tk.Label(frame, text="选择输出目录：").grid(row=1, column=0, padx=10, pady=10, sticky="e")
    output_folder_var = tk.StringVar()
    tk.Entry(frame, textvariable=output_folder_var, width=50).grid(row=1, column=1, padx=5, pady=10)
    tk.Button(frame, text="浏览...", command=select_output_folder, bg="#4CAF50", fg="white").grid(row=1, column=2, padx=10, pady=10)

    # 每个文件的最大测试用例数
    tk.Label(frame, text="每个文件的最大测试用例数：").grid(row=2, column=0, padx=10, pady=10, sticky="e")
    max_cases_var = tk.StringVar(value="100")
    tk.Entry(frame, textvariable=max_cases_var, width=10).grid(row=2, column=1, padx=5, pady=10, sticky="w")

    # 开始按钮
    tk.Button(frame, text="开始分割", command=start_split, bg="#008CBA", fg="white", width=20).grid(row=3, column=0, columnspan=3, pady=30)

    # 启动主循环
    root.mainloop()

# 运行GUI界面
if __name__ == "__main__":
    create_gui()
